package io;

import io.bd.GestorBD;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class ProcesadorLibreria {
    
    private GestorBD gestorBD;
    
    public ProcesadorLibreria(GestorBD gestorBD) {this.gestorBD= gestorBD;}
      
    private Mensaje [] armarRespuesta(Object cuRespuesta, int tipoRespuesta, Object cuAviso, int tipoAviso)
    {
        Mensaje [] ret= new Mensaje[2];
        ret[0]= new Mensaje(tipoRespuesta, cuRespuesta);
        if (cuAviso == null)
            ret[1]= null;
        else
            ret[1]= new Mensaje(tipoAviso, cuAviso);
        return ret;
    }
    
    public Mensaje [] expandirCarpeta(Carpeta padre) throws SQLException
    {
        gestorBD.expandirCarpeta(padre);
        return this.armarRespuesta(padre, 0, null, -10);
    }
    
    public Mensaje [] abrirCliente(Cliente cliente, int duenio) throws SQLException, IOException
    {
        Cliente c= gestorBD.abrirCliente(cliente, duenio);
        return this.armarRespuesta(c, 1, null, -10);
    }
    
    public Mensaje [] cerrarCliente(Cliente cliente)
    {
        gestorBD.cerrarCliente(cliente);
        return this.armarRespuesta(true, 2, null, -10);
    }
    
    public Mensaje [] crearCliente(Cliente cliente, Carpeta padre, int duenio) throws SQLException
    {
        Object [] cuRespuesta= gestorBD.crearCliente(cliente, padre, duenio);
        return this.armarRespuesta(cuRespuesta, 3, cuRespuesta[0], -1);
    }
    
    public Mensaje [] guardarCliente(Cliente cliente) throws SQLException
    {
        Carpeta cu= gestorBD.guardarCliente(cliente);
        return this.armarRespuesta(cu, 4, cu, -1);
    }
    
    public Mensaje [] eliminarCliente(Cliente cliente, Carpeta padre, int eliminador) throws SQLException
    {
        boolean resp= gestorBD.eliminarCliente(cliente, eliminador);
        if (resp)
        {
            Object [] cuAviso= new Object[2];
            cuAviso[0]= padre;
            cuAviso[1]= cliente;
            return this.armarRespuesta(resp, 5, cuAviso, -2);
        }
        else
            return this.armarRespuesta(resp, 5, null, -10);
    }
    
    public Mensaje [] cortarCliente(Cliente cliente, Carpeta padreNuevo, Carpeta padreViejo, int cortador) throws SQLException
    {
        Carpeta resp= gestorBD.cortarCliente(cliente, padreNuevo, cortador);
        if (resp != null)
        {
            Object [] cuAviso= new Object[3];
            cuAviso[0]= cliente;
            cuAviso[1]= padreViejo;
            cuAviso[2]= resp;
            return this.armarRespuesta(resp, 6, cuAviso, -3);
        }
        else
            return this.armarRespuesta(resp, 6, null, -10);
    }
    
    public Mensaje [] copiarCliente(Cliente cliente, Carpeta padreNuevo, int copiador) throws SQLException, IOException
    {
        Carpeta resp= gestorBD.copiarCliente(cliente, padreNuevo, copiador);
        if (resp != null)
            return this.armarRespuesta(resp, 7, resp, -1);
        else
            return this.armarRespuesta(resp, 7, null, -10);
    }
    
    public Mensaje [] crearCarpeta(Carpeta carpeta, Carpeta padre) throws SQLException
    {
        Carpeta resp= gestorBD.crearCarpeta(carpeta, padre);
        return this.armarRespuesta(resp, 8, resp, -1);
    }
    
    public Mensaje [] guardarCarpeta(Carpeta carpeta, Carpeta padre) throws SQLException
    {
        Carpeta resp= gestorBD.guardarCarpeta(carpeta, padre);
        return this.armarRespuesta(resp, 9, resp, -1);
    }
    
    public Mensaje [] eliminarCarpeta(Carpeta carpeta, Carpeta padre, int eliminador) throws SQLException
    {
        boolean resp= gestorBD.eliminarCarpeta(carpeta, eliminador);
        if (resp)
        {
            Object [] cuAviso= new Object[2];
            cuAviso[0]= padre;
            cuAviso[1]= carpeta;
            return this.armarRespuesta(resp, 10, cuAviso, -2);
        }
        else
            return this.armarRespuesta(resp, 10, null, -10);
    }
    
    public Mensaje [] cortarCarpeta(Carpeta carpeta, Carpeta padreNuevo, Carpeta padreViejo, int cortador) throws SQLException
    {
        Carpeta resp= gestorBD.cortarCarpeta(carpeta, padreNuevo, cortador);
        if (resp != null)
        {
            Object [] cuAviso= new Object[3];
            cuAviso[0]= carpeta;
            cuAviso[1]= padreViejo;
            cuAviso[2]= resp;
            return this.armarRespuesta(resp, 11, cuAviso, -3);
        }
        else
            return this.armarRespuesta(resp, 11, null, -10);
    }
    
    public Mensaje [] copiarCarpeta(Carpeta carpeta, Carpeta padreNuevo, int copiador) throws SQLException, IOException
    {
        Carpeta resp= gestorBD.copiarCarpeta(carpeta, padreNuevo, copiador);
        if (resp != null)
            return this.armarRespuesta(resp, 12, resp, -1);
        else
            return this.armarRespuesta(resp, 12, null, -10);
    }
    
    public Mensaje [] crearArchivo(Archivo a, Carpeta padre, InputStream is) throws SQLException
    {
        Carpeta resp= gestorBD.crearArchivo(a, padre, is);
        return this.armarRespuesta(resp, 13, resp, -1);
    }
    
    public InputStream abrirArchivo(Archivo a, int quienAbre) throws SQLException {
        return gestorBD.obtenerBytes(a, quienAbre);} //CUIDADO QUE PUEDE RETORNAR NULL!!!
    
    public Mensaje [] cambiarNombreArchivo(Archivo a, Carpeta padre, int quienCambia) throws SQLException
    {
        Carpeta resp= gestorBD.cambiarNombreArchivo(a, padre, quienCambia);
        if (resp != null)
            return this.armarRespuesta(resp, 15, resp, -1);
        else
            return this.armarRespuesta(resp, 15, null, -10);
    }
    
    public Mensaje [] cerrarArchivo(Archivo a, boolean guardar, InputStream is) throws SQLException
    {
        gestorBD.cerrarArchivo(a, guardar, is);
        return this.armarRespuesta(true, 16, null, -10);
    }
    
    public Mensaje [] eliminarArchivo(Archivo a, Carpeta padre, int quienElimina) throws SQLException
    {
        if (gestorBD.eliminarArchivo(a, quienElimina))
        {
            Object [] cuAviso= new Object[2];
            cuAviso[0]= padre;
            cuAviso[1]= a;
            return this.armarRespuesta(true, 17, cuAviso, -2);
        }
        else
            return this.armarRespuesta(false, 17, null, -10);
    }
    
    public Mensaje [] cortarArchivo(Archivo a, Carpeta padreNuevo, Carpeta padreViejo, int quienCorta) throws SQLException
    {
        Carpeta resp= gestorBD.cortarArchivo(a, padreNuevo, quienCorta);
        if (resp != null)
        {
            Object [] cuAviso= new Object[3];
            cuAviso[0]= a;
            cuAviso[1]= padreViejo;
            cuAviso[2]= resp;
            return this.armarRespuesta(resp, 18, cuAviso, -3);
        }
        else
            return this.armarRespuesta(resp, 18, null, -10);
    }
    
    public Mensaje [] copiarArchivo(Archivo a, Carpeta padreNuevo, int quienCorta) throws SQLException
    {
        Carpeta resp= gestorBD.copiarArchivo(a, padreNuevo, quienCorta);
        if (resp != null)
            return this.armarRespuesta(resp, 19, resp, -1);
        else
            return this.armarRespuesta(resp, 19, null, -10);
    }
    
    public Mensaje [] obtenerItemsAgenda(String fecha) throws SQLException
    {
        List<ItemAgenda> resp= gestorBD.obtenerItemsAgenda(fecha);
        return this.armarRespuesta(resp, 20, null, -10);
    }
    
    public Mensaje [] crearItemAgenda(ItemAgenda item) throws SQLException
    {
        List<ItemAgenda> resp= gestorBD.crearItemAgenda(item);
        return this.armarRespuesta(resp, 21, resp, -4);
    }
    
    public Mensaje [] eliminarItemAgenda(ItemAgenda item) throws SQLException
    {
        boolean resp= gestorBD.eliminarItemAgenda(item);
        return this.armarRespuesta(resp, 22, item, -5);
    }
    
    public Mensaje [] modificarItemAgenda(ItemAgenda item) throws SQLException
    {
        List<ItemAgenda> resp= gestorBD.modificarItemAgenda(item);
        return this.armarRespuesta(resp, 23, resp, -4);
    }
    
    public Mensaje [] buscarCarpeta(String palabraClave) throws SQLException
    {
        List<ItemBusqueda> resp= gestorBD.buscarCarpeta(palabraClave);
        return this.armarRespuesta(resp, 24, null, -10);
    }
    
    public Mensaje [] buscarArchivo(String palabraClave) throws SQLException
    {
        List<ItemBusqueda> resp= gestorBD.buscarArchivo(palabraClave);
        return this.armarRespuesta(resp, 25, null, -10);
    }
    
    public Mensaje [] buscarClienteApellido(String palabraClave) throws SQLException
    {
        List<ItemBusqueda> resp= gestorBD.buscarClienteApellido(palabraClave);
        return this.armarRespuesta(resp, 26, null, -10);
    }
    
    public Mensaje [] buscarClienteNombre(String palabraClave) throws SQLException
    {
        List<ItemBusqueda> resp= gestorBD.buscarClienteNombre(palabraClave);
        return this.armarRespuesta(resp, 27, null, -10);
    }
    
    public Mensaje [] buscarClienteDni(String palabraClave) throws SQLException
    {
        List<ItemBusqueda> resp= gestorBD.buscarClienteDni(palabraClave);
        return this.armarRespuesta(resp, 28, null, -10);
    }
}
